﻿using System;
using LASGui.MainService;

namespace LASGui.Classes
{
    public class LocalEntry : IEntry
    {
        public readonly int Tipo;
        
        public LocalEntry(int tipo)
        {
            Tipo = tipo;
        }
        
        public EntryHasAccount AsientoReferencia { get; set; }
        
        public String NombreCuenta { get; set; }

        #region Propiedades del grid actualizables
        public String LocalDebe
        {
            get { return LocalDebeInit; }
            set { SetValidation(value, 1); }
        }

        public String LocalHaber
        {
            get { return LocalHaberInit; }
            set { SetValidation(value, 2); }
        } 
        #endregion

        #region Propiedades del grid no actualizables
        public String SistemaDebe
        {
            get { return SistemaDebeInit; }
            set { if (value != "") { throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE); } }
        }

        public String SistemaHaber
        {
            get { return SistemaHaberInit; }
            set { if (value != "") { throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE); } }
        }

        public String OtraDebe
        {
            get { return OtraDebeInit; }
            set { if (value != "") { throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE); } }
        }

        public String OtraHaber
        {
            get { return OtraHaberInit; }
            set { if (value != "") { throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE); } }
        }

        public String TipoCambio
        {
            get { return TipoCambioInit; }
            set { if (value != "") { throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE); } }
        }

        public String Moneda
        {
            get { return MonedaInit; }
            set { if (value != "") { throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE); } }
        }
        #endregion

        #region Propiedades para inicializar
        public string SistemaDebeInit { get; set; }

        public string SistemaHaberInit { get; set; }

        public string LocalDebeInit { get; set; }

        public string LocalHaberInit { get; set; }

        public string OtraDebeInit { get; set; }

        public string OtraHaberInit { get; set; }

        public string TipoCambioInit { get; set; }

        public string MonedaInit { get; set; }

        public string TipoCambioSystemLocalInit { get; set; }
        #endregion

        #region Metodos
        /// <summary>
        /// Valida que el property por cambiar sea de la misma moneda y tipo que la transaccion original
        /// </summary>
        /// <param name="value"></param>
        public void SetValidation(String value, int propiedadPorCambiar)
        {
            try
            {
                if (value != "")
                {
                    switch (Tipo)
                    {
                        case 1:
                            if (propiedadPorCambiar == 1)
                            {
                                if (double.Parse(value).GetType() != typeof(double))
                                {
                                    throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE);
                                }
                                LocalDebeInit = value;
                                SistemaDebe = (double.Parse(LocalDebeInit) / double.Parse(TipoCambioSystemLocalInit)) + "";
                            }
                            else
                            {
                                throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE);
                            }
                            break;
                        case 2:
                            if (propiedadPorCambiar == 2)
                            {
                                if (double.Parse(value).GetType() != typeof(double))
                                {
                                    throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE);
                                }
                                LocalHaberInit = value;
                                SistemaHaber = (double.Parse(LocalHaberInit) / double.Parse(TipoCambioSystemLocalInit)) + "";
                            }
                            else
                            {
                                throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE);
                            }
                            break;
                        default:
                            throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE);
                    }
                }
            }
            catch (Exception)
            {
                throw new Exception(Constants.ASIENTOS_ERROR_ENTRY_TYPE);
            }
        }

        /// <summary>
        /// Inicializa el Haber
        /// </summary>
        /// <param name="montoLocal"></param>
        /// <param name="montoSistema"></param>
        /// <param name="montoOtra"></param>
        /// <param name="tipoCambio"></param>
        /// <param name="moneda"></param>
        public void InitHaber(String montoLocal, String montoSistema, String montoOtra, String tipoCambio, String moneda, String tipoCambioSystemLocal)
        {
            SistemaHaberInit = montoSistema;
            LocalHaberInit = montoLocal;
            OtraHaberInit = montoOtra;
            TipoCambioInit = tipoCambio;
            MonedaInit = moneda;
            TipoCambioSystemLocalInit = tipoCambioSystemLocal;
        }

        /// <summary>
        /// Inicializa el Debe
        /// </summary>
        /// <param name="montoLocal"></param>
        /// <param name="montoSistema"></param>
        /// <param name="montoOtra"></param>
        /// <param name="tipoCambio"></param>
        /// <param name="moneda"></param>
        public void InitDebe(String montoLocal, String montoSistema, String montoOtra, String tipoCambio, String moneda, String tipoCambioSystemLocal)
        {
            SistemaDebeInit = montoSistema;
            LocalDebeInit = montoLocal;
            OtraDebeInit = montoOtra;
            TipoCambioInit = tipoCambio;
            MonedaInit = moneda;
            TipoCambioSystemLocalInit = tipoCambioSystemLocal;
        }  
        #endregion
    }
}
